// id生成类, 用size_t的高位1字节标识id, 其他7个字节计数。
// 7个字节计数从0到最大值72057594037927935
// 按每秒需要100万个id, 72057594037927935个数值可以使用2.29年
//	72057594037927935/365/86400/1000000 = 2.29年
#include <iostream>
#include <atomic>
#include <cstdint>
#include <vector>

/**
 * @brief id生成器，高位1字节为id序号，其他7个字节为原子id计数
 *
 */
class IDGenerator
{
public:
    IDGenerator() : counters(256) {}

    size_t get(uint8_t id)
    {
        return (static_cast<size_t>(id) << 56) | counters[id].fetch_add(1);
    }

	// 获取id的最大值
	size_t getMaxValue(uint8_t id)
	{
		return (static_cast<size_t>(id) << 56) | MaxValue;
	}
private:
	static constexpr size_t MaxValue = static_cast<size_t>(-1);
    std::vector<std::atomic<size_t>> counters;
};

int main()
{
    IDGenerator generator;
    uint8_t id1 = 42;
    uint8_t id2 = 67;

	size_t t = 0xffffffffffffff;
	printf("7字节最大值为%lu\n", t);
    for (int i = 0; i < 10; ++i) {
		generator.getMaxValue(id1);
        size_t value1 = generator.get(id1);
        size_t value2 = generator.get(id2);

        std::cout << "ID1: " << static_cast<int>(id1) << ", Value: " << value1 << " ,MaxValue=" << generator.getMaxValue(id1) << std::endl;
        std::cout << "ID2: " << static_cast<int>(id2) << ", Value: " << value2 << " ,MaxValue=" << generator.getMaxValue(id2) << std::endl;
    }

    return 0;
}
